#include "manejadorArchivos.h"

ManejadorArchivos* ManejadorArchivos::instance = NULL;

ManejadorArchivos::ManejadorArchivos(){
}
			
ManejadorArchivos* ManejadorArchivos::get_instance(){
	if (instance == NULL)
			instance = new ManejadorArchivos();
	return instance;		
}

ManejadorArchivos::~ManejadorArchivos(){
}
			
void ManejadorArchivos::escribir_bloque(int fd, unsigned int num_bloque,char* bloque, unsigned int tam)
														throw (ExcepEscribirBloque){
	unsigned int cant_escritos = 0 ;
	ssize_t cant=0;
	int error = lseek(fd,tam*num_bloque,SEEK_SET);
	if (error == -1)
		throw ExcepEscribirBloque(ManejadorErrores::get_msg_error(errno));
		
	while ((cant_escritos < tam)){
		cant = write(fd,bloque+cant_escritos,tam-cant_escritos);
		if (cant != -1)
			cant_escritos += cant; 
		else
			throw ExcepEscribirBloque(ManejadorErrores::get_msg_error(errno));
	}
}
			
char* ManejadorArchivos::leer_bloque(int fd, unsigned int num_bloque, unsigned int tam) throw (ExcepLeerBloque){
	char * bloque; 
	unsigned int cant_leidos = 0 ;
	ssize_t cant=0;
	int error = lseek(fd,tam*num_bloque,SEEK_SET);
	if (error == -1) 
		throw ExcepLeerBloque(ManejadorErrores::get_msg_error(errno));		
	
	bloque = new char[tam];
	
	while ((cant_leidos < tam)){
		cant = read(fd,bloque+cant_leidos,tam-cant_leidos);
		if (cant != -1)
			cant_leidos += cant; 
		else
			throw ExcepLeerBloque(ManejadorErrores::get_msg_error(errno));
	}
	
	return bloque;
}
long ManejadorArchivos::get_tam_archivo(int fd){
	struct stat buffer;
	long ret = 0;
	ret = fstat(fd, &buffer);	
	
	if(ret != -1 )
		ret = (int)(buffer.st_size);
		
	return ret;
}

int ManejadorArchivos::crear_archivo(std::string &nombre) {
	mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
	return open(nombre.c_str(),O_RDWR | O_CREAT | O_EXCL,mode);
}

int ManejadorArchivos::abrir_archivo(std::string &nombre){
	mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;	
	return open(nombre.c_str(), O_RDWR, mode);
}
			
int ManejadorArchivos::cerrar_archivo(int fd){
	return close(fd);
} 			

void ManejadorArchivos::destroy(){
	delete ManejadorArchivos::instance;	
}

bool ManejadorArchivos::truncar_arch(int fd, unsigned int pos_trunc){
	int res = ftruncate(fd, pos_trunc);
	if( res != 0)
		return false;
	return true;	
}

